package com.example.demo.utils.common;

import com.example.demo.utils.bean.BeanUtils;

import java.util.*;

/**
 * 集合类的通用工具类
 */
public class CollectionUtils extends org.apache.commons.collections.CollectionUtils {

	/**
	 * 将list数组转换为key和value相等的map
	 * @param list 指定list
	 * @return
	 */
	public static <T> Map<T, T> toMap(List<T> list) {
		Map<T, T> map = new HashMap<T, T>();
		if (list != null) {
			for (T o : list) {
				map.put(o, o);
			}
		}
		return map;
	}

	/**
	 * 将指定集合组装成以指定split分割的字符串
	 * @param c 指定集合
	 * @param split 分隔符
	 * @return
	 */
	public static String join(Collection<?> c, String split) {
		return join(c, null, split);
	}

	/**
	 * 将指定集合组装成以指定split分割的字符串，property不为空则获取制定对象的指定属性值
	 * @param c 指定集合
	 * @param property 指定属性
	 * @param split 分隔符
	 * @return
	 */
	public static String join(Collection<?> c, String property, String split) {
		StringBuffer sb = new StringBuffer();
		int index = 0;
		Iterator<?> iterator = c.iterator();
		while (iterator.hasNext()) {
			if (index != 0) {
				sb.append(split);
			}
			Object o = iterator.next();
			if (StringUtils.isNotEmpty(property)) {
				String[] tokens = property.split("\\.");
				sb.append(BeanUtils.getValue(o, tokens));
			} else {
				sb.append(o);
			}

			index++;
		}
		return sb.toString();
	}

	/**
	 * 删除集合中为空部分
	 * @param c 指定集合
	 * @return
	 */
	public static Collection<?> removeEmpty(Collection<?> c) {
		if(c == null ){
			return null;
		}
		Iterator<?> ite = c.iterator();
		while (ite.hasNext()) {
			if (ite.next() == null) {
				ite.remove();
			}
		}
		return c;
	}

	/**
	 * 删除重复元素
	 *
	 * @param c 列表对象
	 * @return 新列表对象
	 */
	public static <T> List<T> unique(List<T> c) {
		if(isEmpty(c)) {
			return c;
		}

		Map<T, T> map = new HashMap<>();
		List<T> newc = new ArrayList<>();
		for(T e : c) {
			if(!map.containsKey(e)) {
				map.put(e, e);
				newc.add(e);
			}
		}

		return newc;
	}

	public static void addAll(Collection<Object> dests, Collection<? extends Object> objects) {
		if(objects != null) {
			for(Object o : objects) {
				dests.add(o);
			}
		}
	}

}
